/**
 * never类型
 * 1. never类型表示的是那些永不存在的值的类型。
 * 2. 一般用于函数返回值的类型，表示函数执行到最后一行之后，不会有任何返回值的情况。
 * 3. never类型是其他类型子类型，可以赋值给其他类型，例如，可以赋值给void类型。
 */

/**
 * 应用场景：
 * 1. 抛出异常：当函数中抛出一个异常（使用 throw 语句），并且没有 try...catch 语句块来捕获这个异常时
 *    ，函数的执行流程会被中断，因此不会有返回值
 * 2. 死循环：当函数中存在无限循环，并且没有显式的返回语句时，函数也不会正常返回。
 * 3. 终止程序：在某些情况下，函数可能会调用如 process.exit() 这样的方法来终止程序的执行，这同样会导致函数不会正常返回。
 */
(() => {
  // 必定抛出异常终止程序，故不会有返回值
  function error(message: string): never {
    throw new Error(message)
  }

  // 死循环，不会有返回值
  function loop(): never {
    while (true) {
      console.log('loop')
    }
  }

  // never与void的差异
  // void类型只是没有返回值 但本身不会出错
  function Void(): void {
    console.log();
  }

  // 只会抛出异常没有返回值
  function Never(): never {
    throw new Error('aaa')
  }

  // 应用场景
  interface A {
    type: 'foo'
  }
  interface B {
    type: 'bar'
  }
  interface C {
    type: 'bizz'
  }
  type All = A | B | C
  function handleValue(val: All) {
    switch (val.type) {
      case 'foo':
        break;
      case 'bar':
        break;
      case 'bizz':
        break;
      default:
        const exhaustiveCheck: never = val
        break;
    }
  }
})()

